  var combinations = (function() {
      var res = [];

      function combinations(arr, k, start, idx, current) {
          if (idx === k) {
              res.push(current.slice());
              return;
          }
          for (var i = start; i < arr.length; i += 1) {
              current[idx] = arr[i];
              combinations(arr, k, i + 1, idx + 1, current);
          }
      }
      /**
       * Finds all the combinations of given array.<br><br>
       * A combination is a way of selecting members from a grouping,
       * such that (unlike permutations) the order of selection does not matter.
       * For example given three fruits, say an apple, an orange and a pear,
       * there are three combinations of two that can be drawn from this set:
       * an apple and a pear; an apple and an orange; or a pear and an orange.
       *
       * @example
       *
       * var combinations = require('path-to-algorithms/src/' +
       * 'combinatorics/combinations').combinations;
       * var result = combinations(['apple', 'orange', 'pear'], 2);
       * // [['apple', 'orange'],
       * //  ['apple', 'pear'],
       * //  ['orange', 'pear']]
       * console.log(result);
       *
       * @module combinatorics/combinations
       * @public
       * @param arr {Array} Set of items.
       * @param k {Number} Size of each combination.
       * @return {Array} Returns all combinations.
       */
      return function(arr, k) {
          res = [];
          combinations(arr, k, 0, 0, []);
          var temp = res;
          // Free the extra memory
          res = null;
          return temp;
      };
  }());

  function solve(arr, n) {
      for (var i = 1; i <= arr.length; i++) {
          var temp = combinations(arr, i)
          if (temp.some(v => v.reduce((s, x) => s += x, 0) % n === 0)) return true;
      }
      return false;
  };

  console.log(solve([1, 2, 3, 4, 5], 8))